#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ls (o<<1)
#define rs (o<<1 | 1)
const int N = 2e5+9;
const int INF = 2e18;

int n,q;
int lz[N*4], a[N], tmax[N*4], tmin[N*4];

void update(int s, int e, int o, int x){
    tmax[o] += x;
    tmin[o] += x;
    lz[o] += x;
}

void pushup(int o){
    tmax[o] = max(tmax[ls], tmax[rs]);
    tmin[o] = min(tmin[ls], tmin[rs]);
}

void pushdown(int s, int e, int o){
    if ( lz[o]==0 ) return;

    int mid = (s+e) / 2;
    update(s,mid,ls,lz[o]);
    update(mid+1,e,rs,lz[o]);
    lz[o] = 0;
}

void build(int s=1, int e=n, int o=1){
    if ( s==e ) {
        tmax[o] = a[s];
        tmin[o] = a[s];
        return;    
    }

    int mid = (s+e) / 2;
    build(s,mid,ls);
    build(mid+1,e,rs);
    pushup(o);
}

void add(int l, int r, int x, int s=1, int e=n, int o=1){
    if ( l<=s && e<=r ){
        update(s,e,o,x);
        return;
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    if ( l<=mid ) add(l,r,x,s,mid,ls);
    if ( mid+1<=r ) add(l,r,x,mid+1,e,rs);
    pushup(o);
}

int querymax(int l, int r, int s=1, int e=n, int o=1){
    if ( l<=s && e<=r ){        
        return tmax[o];
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    int res = -INF;
    if ( l<=mid ) res = max(res,querymax(l,r,s,mid,ls));
    if ( mid+1<=r ) res = max(res,querymax(l,r,mid+1,e,rs));
    pushup(o);
    return res;
}

int querymin(int l, int r, int s=1, int e=n, int o=1){
    if ( l<=s && e<=r ){        
        return tmin[o];
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    int res = INF;
    if ( l<=mid ) res = min(res,querymin(l,r,s,mid,ls));
    if ( mid+1<=r ) res = min(res,querymin(l,r,mid+1,e,rs));
    pushup(o);
    return res;
}

signed main(){
    cin >> n >> q;
    for ( int i=1; i<=n; i++ ) cin >> a[i];
    build();

    while(q--){
        int op; cin >> op;
        if ( op==1 ){
            int l,r,x; cin >> l >> r >> x;
            add(l,r,x);
        } else {
            int l,r; cin >> l >> r;
            cout << querymax(l,r) << ' ' << querymin(l,r) << '\n'; 
        }
    }

    return 0;
}